﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AudiPyme.DAL;

namespace AudiPyme.BLL
{

    public class ActivosEmpresaNegocio
    {
        //Método que sirve para eliminar los activos seleccionados en las páginas de gestión
        public static void EliminarActivosEmpresa(List<ActivoEmpresaCheck> CheckList, int IdEmpresa)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            for (int i = 0; i < CheckList.Count(); i++)
            {
                if (CheckList[i].IdActivo != 0)
                {
                    ActivosEmpresa nuevoActivo = new ActivosEmpresa();
                    int IdActivo = CheckList[i].IdActivo;
                    ActivosEmpresaFactory.EliminarActivosEmpresa(IdActivo, IdEmpresa);
                }
            }
        }

        //Método que construye un activo según los parámetros y lo inserta en la base de datos
        public static void InsertaActivo(int IdEmpresa, String Nombre, String Descripcion, String TipoActivo, int CosteActivo, int ValorEstrategico)
        {
            int IdTipoActivo = TiposActivosFactory.BuscarIdTipoActivo(TipoActivo);
            //Recogemos el Id de Tipo Activo asociado al activo
            ActivosEmpresa NuevoActivo = new ActivosEmpresa();
            NuevoActivo.IdTipoActivo = IdTipoActivo;
            NuevoActivo.CosteActivo = CosteActivo;
            NuevoActivo.IdEmpresa = IdEmpresa;
            NuevoActivo.ValorEstrategico = ValorEstrategico;
            NuevoActivo.Descripcion = Descripcion;
            NuevoActivo.Nombre = Nombre;
            //Añadimos que este activo actualmente esta en la empresa. Actual=true
            NuevoActivo.Actual = true;
            ActivosEmpresaFactory.InsertarActivo(NuevoActivo);
        }

        //Método que recoge el número de activos actuales de una empresa según los rangos de coste que se pasan por parámetros
        public static List<int> ActivosEmpresaPorCoste(int EmpresaUsuario, List<int> Rangos)
        {
            List<int> ListaActivosValor = new List<int>();
            ModeloContainer agenteBD = new ModeloContainer();
            int nuevoRango = 0, viejoRango = 0;
            for (int i = 0; i < Rangos.Count && Rangos[i] != 0; i++)
            {
                int ActivosCosteRango = -1;
                //Si estamos en el primer rango, no existe rango anterior
                if (i == 0)
                {
                    nuevoRango = Rangos[i];
                    ActivosCosteRango = (from ActEmp in agenteBD.ActivosEmpresaEstablecer
                                         where ActEmp.CosteActivo <= nuevoRango && ActEmp.CosteActivo > 0 &&
                                                ActEmp.IdEmpresa == EmpresaUsuario && ActEmp.Actual == true
                                         select ActEmp).Count();
                }
                //Si el rango elegido es superior a un millón de €
                else if (Rangos[i].Equals(1000001))
                {
                    nuevoRango = Rangos[i];
                    ActivosCosteRango = (from ActEmp in agenteBD.ActivosEmpresaEstablecer
                                         where ActEmp.CosteActivo > 1000000 &&
                                                ActEmp.IdEmpresa == EmpresaUsuario && ActEmp.Actual == true
                                         select ActEmp).Count();
                }
                //Si no, estamos tenemos un rango inferior y otro superior
                else
                {
                    viejoRango = Rangos[i - 1];
                    nuevoRango = Rangos[i];
                    ActivosCosteRango = (from ActEmp in agenteBD.ActivosEmpresaEstablecer
                                         where ActEmp.CosteActivo <= nuevoRango &&
                                                ActEmp.CosteActivo > viejoRango &&
                                                ActEmp.IdEmpresa == EmpresaUsuario && ActEmp.Actual == true
                                         select ActEmp).Count();
                }
                //Algo ha fallado, devolvemos null
                if (ActivosCosteRango == -1)
                {
                    return null;
                }
                ListaActivosValor.Insert(i, ActivosCosteRango);
            }

            return ListaActivosValor;
        }
    }
}
